<?php declare(strict_types=1);

namespace App\Services\Easypay\Incoming;

use App\Api\Controllers\Config\EasyPayConfigController;
use App\Models\EasypayStore;
use App\Models\MyBankCategory;
use App\Models\Store;
use App\Models\StoreBank;
use App\Models\StoreImg;
use App\Models\VbillStoreCategory;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class Incoming
{

    /**
     * 提交进件信息
     * @param array $rateConfig
     * @param Store $store
     * @param StoreImg $StoreImg
     * @param StoreBank $StoreBank
     * @param VbillStoreCategory|MyBankCategory $MyBankCategory
     * @return int[]
     */
    public function submit(array $rateConfig, Store $store, StoreImg $storeImg, StoreBank $storeBank, string $version): array
    {
        try {
            $easypay_store = EasypayStore::query()->where([
                'store_id' => $store->store_id,
                "version" => $version
            ])
                ->select('mer_trace', 'audit_status')
                ->first();
            if (!empty($easypay_store) && $easypay_store->audit_status == 3) {
                throw new \Exception("审核中");
            } else if (!empty($easypay_store) && $easypay_store->audit_status == 0) {
                return [
                    "status" => 1,
                    "message" => "审核成功"
                ];
            }
            $easypay_config_obj = new EasyPayConfigController();
            $easypay_config = $easypay_config_obj->easypay_config($store->config_id);
            if (empty($easypay_config)) {
                throw new \Exception("易生支付配置不存在请检查配置");
            }
            //商户类型
            if ($store->store_type == '1') { //1-个体工商户
                $mer_mode = "1";
            } elseif ($store->store_type == '2') { //2-企业
                $mer_mode = "0";
            } else { //3-小微商户
                $mer_mode = "2";
            }

            $mer_area = '';
            $area = DB::table('easypay_city')->where(['YL_PR_NAME' => $store->province_name . $store->city_name])
                ->where(['YL_NAME' => $store->area_name])->first();
            if ($area) {
                $mer_area = $area->YL_CODE;
            }
            $myBankCategory = MyBankCategory::where('category_id', $store->category_id)
                ->first();
            if (empty($myBankCategory)) {
                $myBankCategory = VbillStoreCategory::where('id', $store->category_id)
                    ->first();
            }
            if (empty($myBankCategory)) {
                throw new \Exception("请选择正确的门店类目");
            }
            //处理信息
            $reqData = [
                'picInfoList' => json_encode(PicListService::collect($easypay_config, $mer_mode, $store, $storeImg, $storeBank, $myBankCategory)),
                'merInfo' => json_encode([
                    'merMode' => $mer_mode, //商户类型（0-企业 1-个体户 2-个人）
                    'merName' => $store->store_name, //注册名称
                    'businName' => $store->store_short_name, //经营名称 (店名)
//                        'merEngName' => '', //0,英文名称
                    'merType' => $myBankCategory->mcc, //商户类型（MCC），银联定义的 MCC 编码
                    'standardFlag' => '0', //行业大类 0-标准、1-优惠、2-减免
                    'merArea' => $mer_area, //商户区域：银联地区码
                    'merAddr' => $store->province_name . $store->city_name . $store->area_name . $store->store_address, //注册地址
                    'businBegtime' => '0630', //营业时间：开始时间，格式：HHMM
                    'businEndtime' => '2230', //营业时间：结束时间，格式：HHMM
                    'employeeNum' => '1', //公司规模:1：0-50 人；2：50-100 人；3:100 以上
                    'businForm' => '02', //经营形态：02-普通店、01-连锁店
//                        'conMode' => '0', //o,商户联接方式 1-直联(直联银联的商户)、0-间联（非直联银联的，默认为 0）
//                        'payAccMode' => '0', //o,是否虚拟账户（0-银行账户（默认），1-虚拟账户）
                    'stlmType' => '1', //o,是否易生清算：0 -- 挂账， 1 -- 正常清算商户，X--不清算，F--不结算
                ]),
                'operaTrace' => uniqid(),
                'messageType' => 'AGMERAPPLY',
                'backUrl' => url('api/easypay/merchant_apply_notify_url'),
                'clientCode' => $easypay_config->client_code,
                'licInfo' => json_encode([ //营业执照信
                    'merLic' => ($mer_mode == '0' || $mer_mode == '1') ? $store->store_license_no : '', //C，工商注册号/统一社会信用码（营业执照）,merMode 为0,1 时，必传
                    'licValidity' => ($mer_mode == '0' || $mer_mode == '1') ? $this->EasyPayTimeFormat($store->store_license_stime, $store->store_license_time) : [], //C,营业执照有效期 格式：["起始日期","截止日期"],JSON 格式字符串 ,merMode 为 0,1 时，必传
                    'licName' => $store->store_short_name, //注册名称
                    'businScope' => $store->category_name, //主营业务
                    'capital' => '10', //注册资本：单位-万元???
//                        'capitalCurrency' => '', //o,注册资本币种:默认-人民币
                    'licAddr' => $store->province_name . $store->city_name . $store->area_name . $store->store_address, //注册地址
                    'controlerName' => $store->head_name, //控股股东或实际控制人姓名或名称
                    'controlerLegalCode' => $store->head_sfz_no, //控股股东或实际控制人证件号码
                    'controlerLegalType' => '0', //控股股东或实际控制人证件种类：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
                    'controlerLegalValidity' => $this->EasyPayTimeFormat($store->head_sfz_stime, $store->head_sfz_time), //控股股东或实际控制人证件有效期
                    'controlerCapital' => '', //控股股东或实际控制人证出资金额:单位-万元???
//                        'controlerDate' => '', //o,控股股东或实际控制人出资日期
//                        'controlerRate' => '', //o,控股股东或实际控制人控股股权比例
                ]),
                'funcInfo' => json_encode([ //商户的功能信息，包括商户的扣率信息，JSON 格式字符串(list)，可以开通 1 个或多个功能,如果需要关闭功能，只需要送对应功能的功能 ID（funcId 字段） 扣率的单位默认按比例（单位%），如果有特殊情况，会在对应的功能里说明
                    [ //支付宝
                        'funcId' => '2', //功能ID
                        'calcVal' => $rateConfig['rate'], //扣率
                    ],
                    [ //微信
                        'funcId' => '3', //功能ID
                        'calcVal' => $rateConfig['rate'], //扣率
                    ],
                    [ //实时入账
                        'funcId' => '25', //功能ID
                        'tradeType' => '0', //交易类型：0-全部；1-银行卡；2-条码支付
                        'DCalcType' => '1', //借记卡计费类型:0-按笔数（单位：元）;1-按比例（单位：%）???
                        'DCalcVal' => '0.1',//$info['rate_list']['rate'], //借记卡扣率???
                        'CCalcType' => '1', //信用卡计费类型:0-按笔数（单位：元）;1-按比例（单位：%）???
                        'CCalcVal' => '0.1',//$info['rate_list']['rate'], //信用卡扣率???
                    ],
                    [ //银联二维码
                        'funcId' => '12', //功能ID
                        'DStlmType' => '1', //借记卡扣率方式 :1-封顶;0-不封顶???
                        'DCalcVal' => '0.6',//$info['rate_list']['rate'], //借记卡扣率???
                        'DStlmMaxAmt' => '30', //借记卡封顶金额???
                        'DFeeLowLimit' => '0', //借记卡手续费最低值???
                        'CCalcVal' => '0.6', //信用卡扣率???
                        'CFeeLowLimit' => '0', //信用卡手续费最低值???
                    ]
                ]),
                'plusInfo' => json_encode([ //附加信息，商户的法人身份证等信息
                    'merLegal' => $store->head_name, //法定代表人姓名
                    'legalType' => '0', //证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
                    'legalCode' => $store->head_sfz_no, //法人证件号码
                    'legalValidity' => $this->EasyPayTimeFormat($store->head_sfz_stime, $store->head_sfz_time), //证件有效期 格式：["起始日期","截止日期"],JSON 格式字符串,例如：["2011.01.01","2039.01.01"]
                    'legalPhone' => $store->people_phone, //手机号
//                        'legalMobile' => '', //0,固定电话
                    'linkMan' => $store->people, //商户联系人姓名
                    'linkmanType' => '0', //证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
                    'linkmanCode' => $store->head_sfz_no, //证件号码
                    'linkmanValidity' => $this->EasyPayTimeFormat($store->head_sfz_stime, $store->head_sfz_time), //证件有效期 格式：["起始日期","截止日期"],JSON 格式字符串
                    'linkmanPhone' => $store->people_phone, //手机号
//                    "contractNo" => "",//电子协议编号 电子协议与协议图片2选1必传
//                    "signatoryName" => "",//签署方名称 电子协议与协议图片2选1必传
//                        'linkmanMobile' => '', //o,固定电话
//                        'webSite' => '', //o,商户网址
//                        'webName' => '', //o,网站或 APP 名称
//                        'webIcp' => '', //o,ICP 许可证编号
                ]),
                'version' => '1.0',
                'accInfo' => json_encode([ //结算账户信息
                    'bankName' => $storeBank->bank_name, //开户行名称
                    'bankCode' => $storeBank->bank_no, //开户行行号
                    'account' => $storeBank->store_bank_no, //账号
                    'accName' => $storeBank->store_bank_name, //账户名称
                    'accType' => ($storeBank->store_bank_type == '02') ? '10' : '00', //账户类型：00-个人；10-对公
//                        'accArea' => '', //O,账户所属区域:区号
                    'legalType' => ($storeBank->store_bank_type == '01') ? '0' : '', //C,证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件 accType 为个人时必填
                    'legalCode' => ($storeBank->store_bank_type == '01') ? (!empty($storeBank->bank_sfz_no) ? $storeBank->bank_sfz_no : (empty($store->head_sfz_no) ? "" : $store->head_sfz_no)) : (empty($store->head_sfz_no) ? "" : $store->head_sfz_no), //C,证件号 accType 为个人时必填
                    'accPhone' => $store->people_phone, //C,对私手机号 accType 为个人时必填
                ]),
            ];
            $reqData['MAC'] = Config::sign($easypay_config, $reqData);

            $headers = ["Content-Type: multipart/form-data;", "Charset: UTF-8"];
            $result = json_decode(Config::curl(Config::getDomain() . Config::APPLAY, $reqData, $headers), true);

            Log::channel("easypay")->info("易生进件", [
                "reqData" => $reqData,
                "resData" => $result
            ]);
            if (empty($result) || !isset($result['retCode'])) {
                throw  new \Exception("请求失败");
            } else if (isset($result['retCode']) && $result['retCode'] != '0000') {
                throw  new \Exception($result['retMsg'] . "--------");
            }
            if (!empty($easypay_store)) {
                $easypay_store->operaTrace = $result['operaTrace'];
                $easypay_store->mer_trace = $result['merTrace'];
                $easypay_store->version = $version;
                $easypay_store->save();
            } else {
                EasypayStore::create([
                    'config_id' => 1234,
                    'operaTrace' => $result['operaTrace'],
                    'mer_trace' => $result['merTrace'],
                    'store_id' => $store->store_id,
                    "version" => $version
                ]);
            }
            return [
                'status' => 2,
                'message' => '审核中',
            ];
        } catch (\Exception $e) {
            return [
                "status" => 2,
                "message" => $e->getMessage()
            ];
        }
    }

    protected function EasyPayTimeFormat($start_time, $end_time)
    {
        if ($start_time) {
            $start_time = str_replace('-', '.', $start_time);
        } else {
            $start_time = '';
        }

        if ($end_time) {
            if ($end_time == '长期') {
                $end_time = '2999.12.31';
            } else {
                $end_time = str_replace('-', '.', $end_time);
            }
        } else {
            $end_time = '';
        }

        return [$start_time, $end_time];
    }

}